package club.xiaojiawei.array;

/**
 * @author 肖嘉威
 * @version 1.0
 * @date 6/15/22 12:06 AM
 * @question 941. 有效的山脉数组
 * @description 给定一个整数数组 arr，如果它是有效的山脉数组就返回 true，否则返回 false。
 * 让我们回顾一下，如果 arr 满足下述条件，那么它是一个山脉数组：
 * arr.length >= 3
 * 在 0 < i < arr.length - 1 条件下，存在 i 使得：
 * arr[0] < arr[1] < ... arr[i-1] < arr[i]
 * arr[i] > arr[i+1] > ... > arr[arr.length - 1]
 */
public class ValidMountainArray941 {

    public static void main(String[] args) {
        ValidMountainArray941 test = new ValidMountainArray941();
        boolean result = test.validMountainArray2(new int[]{0, 3, 2, 1});
        System.out.println(result);
    }

    /**
     * 遍历
     * @param arr
     * @return
     */
    public boolean validMountainArray(int[] arr) {
        if (arr.length < 3 || arr[1] <= arr[0]){
            return false;
        }
        boolean up = true;
        int cur;
        for (int i = 2; i < arr.length; i++) {
            cur = arr[i];
            if (cur == arr[i - 1]){
                return false;
            }else if (up && cur < arr[i - 1]){
                up = false;
            }else if (!up && cur > arr[i - 1]){
                return false;
            }
        }
        return !up;
    }

    /**
     * 遍历-优化
     * @param arr
     * @return
     */
    public boolean validMountainArray2(int[] arr) {
        int length = arr.length;
        if (length < 3 || arr[1] <= arr[0] || arr[length - 1] >= arr[length - 2]){
            return false;
        }
        int i = 2;
        for (; i < length; i++){
            if (arr[i] <= arr[i - 1]){
                break;
            }
        }
        int j = length - 3;
        for (; j >= 0; j--){
            if (arr[j] <= arr[j + 1]){
                break;
            }
        }
        return i == j + 2;
    }
}
